package sockets;

import java.io.DataInputStream;
import java.net.Socket;
import java.io.DataOutputStream;
import java.net.InetAddress;
import java.io.IOException;
import java.net.SocketAddress;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JTextArea;

/*
 * @author Danilo
 * @author Julio
 */

public class ClienteTCP extends Thread{
    // Variaveis que recebem a mensagem enviada, o hostname para abrir a conexão com o servidor e a porta de comunicação.
    protected String hostName;
    static String msgTCP;
    protected int contador;
    boolean aux;
    boolean ocupado;
    ArrayList<String> msgCliente = new ArrayList<String>();
    int portaTCP = 6006;
    
    // Variavel responsável por mostrar na tela as mensagens de comunicação com o servidor.
    protected JTextArea clienteOut;
    public ClienteTCP(JTextArea saida){
         clienteOut = saida;
         aux = false;
         ocupado = false;
    }


    @Override
    public void run(){
         // Criar um socket para o clienteTCP.
            Socket socket = null;
            
         while(!aux){

             try{
                 
                // Criar um variável que recebera o endereço para realizar a conexão com o servidorTCP.
                InetAddress address = InetAddress.getByName(hostName);
                synchronized(this){
                // Atribuir o endereço e a porta de conexação
                clienteOut.append("Tentativa de conexão com: "+ hostName+ ":"+portaTCP);
                clienteOut.append("\nAguarde um momento\n\n");
                socket = new Socket(address , portaTCP);
                }
                // Utilizada para enviar mensagem de saida para o socket do servidorTCP.
                DataOutputStream ostream = new DataOutputStream(socket.getOutputStream());

                // Utilizada para receber a mensagem de resposta do servidorTCP.
                DataInputStream istream = new DataInputStream(socket.getInputStream());

                // Capturar a respostas do servidor.
                if(socket.isConnected()){
                    ostream.writeUTF(msgTCP);
                    clienteOut.append("Conexão com "+hostName+" realizada com sucesso!\nEnviando mensagem!\n");
                    ostream.flush();

                // Mostrar na tela a respostas do servidor.
                String resposta = istream.readUTF();
                if(resposta.equals(null)){
                    clienteOut.append("Passou 3 segundos. \nO pacote foi perdido\n\n");
                }else
                    clienteOut.append("Resposta do servidor "+ hostName +": " + resposta+ "__________________________\n");
                
                 }
            }catch(IOException e){
                    if (contador < 1){
                            // Mostrar na tela que não foi possivel enviar o pacote, já que o timer terminou.
                            clienteOut.append("Falha de conexão com " +hostName+ ". \n"+"_________________________________\n\n");    
                    }
                    else{
                        aux = true;  
                    }
                    contador++;   
                } finally {
                    try {
                        if((contador == 0) || (contador >=2)){
                            if(contador >=2)
                                clienteOut.append("Não foi posspivel conectar com: "+hostName+"\n"
                                        + "__________________________\n");
                            socket.close();
                            aux = true;
                        } 
                    } catch(Exception e){
                    }
                }  
         }
     }
}
    

